import java.text.NumberFormat;
import java.util.Scanner;

/**
 * 【方法】的练习
 * p 本金
 * mr 月利息
 * m 还款月数
 * payment 每月还款
 */

public class Calculator3 {
    public static void main(String[] args) {

        double p = InputAndCheckP();           //=============>【方法调用】

        double mr = InputAndCheckMr();         //=============>【方法调用】

        int m = InputAndCheckM();              //=============>【方法调用】

        double payment = calculate(p, mr, m);  //=============>【方法调用】

        PrintInfo(p,mr,m,payment);             //=============>【方法调用】
    }


    /**
     * 输入并检查还款月数
     * @return 还款月数
     */
    static int InputAndCheckM(){
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入还款月数:");
        int m = scanner.nextInt();          //m为还款月数

        if (m < 1 || m > 360) {
            throw new IllegalArgumentException("还款月数必须在1-360之间");
        }
        return m;
    }

    /**
     * 输入后把年利率计算成月利率并检查
     * @return 月利率
     */
    static double InputAndCheckMr() {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入年利率:");
        double yr = scanner.nextDouble();   //yr为年利率

        if (yr < 1 || yr > 36) {
            throw new IllegalArgumentException("年利率必须在1~36之间");
        }
        return yr / 12.0 / 100;
    }

    /**
     * 输入并检查贷款本金P
     * @return 贷款本金
     */
    static double InputAndCheckP(){
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入本金:");
        double p = scanner.nextDouble();    //p为贷款本金principal

        if (p <= 0) {
//            System.out.println("贷款金额必须>0");
            //throw new 异常类型("提示信息")
            throw new IllegalArgumentException("贷款金额必须>0");
        }
        return p;
    }

    /**
     * 打印详细信息
     * @param p 本金
     * @param mr 月利息
     * @param m 还款月数
     * @param payment 每月还款
     */
    static void  PrintInfo(double p, double mr,double m,double payment ){
        String format = NumberFormat.getCurrencyInstance().format(payment); //格式化计算结果为货币格式
        System.out.println("每月需还款:" + format);


        for (int i = 0; i < m; i++) {
            double payInterest = p * mr;                 //偿还利息
            double payPrincipal = payment - payInterest; //偿还本金
            p = p - payPrincipal;                        //剩余本金

            System.out.print("月份:" + (i + 1));
            System.out.print("\t本月还款:"+NumberFormat.getCurrencyInstance().format(payment));
            System.out.print("\t偿还本金:"+NumberFormat.getCurrencyInstance().format(payPrincipal));
            System.out.print("\t偿还利息:"+NumberFormat.getCurrencyInstance().format(payInterest));
            System.out.println("\t剩余本金:"+NumberFormat.getCurrencyInstance().format(p));
        }

        System.out.println("还款总额:"+NumberFormat.getCurrencyInstance().format(payment*m));
    }

    /**
     * 以等额等息的方式计算还款金额
     * @param p  本金
     * @param mr 月利息
     * @param m  还款月数
     * @return   每月还款金额
     */
    static double calculate(double p, double mr, double m) {
        double pow = Math.pow(1 + mr, m);
        return p * mr * pow / (pow - 1);
    }
}
